//
// PurgeStrategy.h
//
// Library: Foundation
// Package: Logging
// Module:  FileChannel
//
// Definition of the PurgeStrategy class.
//
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
// and Contributors.
//
// SPDX-License-Identifier:	BSL-1.0
//


#ifndef Foundation_PurgeStrategy_INCLUDED
#define Foundation_PurgeStrategy_INCLUDED


#include <vector>
#include "Poco/File.h"
#include "Poco/Foundation.h"
#include "Poco/Timespan.h"


namespace Poco
{


class Foundation_API PurgeStrategy
/// The PurgeStrategy is used by FileChannel
/// to purge archived log files.
{
public:
    PurgeStrategy();
    virtual ~PurgeStrategy();

    virtual void purge(const std::string & path) = 0;
    /// Purges archived log files. The path to the
    /// current "hot" log file is given.
    /// To find archived log files, look for files
    /// with a name consisting of the given path
    /// plus any suffix (e.g., .1, .20050929081500, .1.gz).
    /// A list of archived files can be obtained by calling
    /// the list() method.

protected:
    void list(const std::string & path, std::vector<File> & files);
    /// Fills the given vector with a list of archived log
    /// files. The path of the current "hot" log file is
    /// given in path.
    ///
    /// All files with the same name as the one given in path,
    /// plus some suffix (e.g., .1, .20050929081500, .1.gz) are
    /// considered archived files.

private:
    PurgeStrategy(const PurgeStrategy &);
    PurgeStrategy & operator=(const PurgeStrategy &);
};


class Foundation_API PurgeByAgeStrategy : public PurgeStrategy
/// This purge strategy purges all files that have
/// exceeded a given age (given in seconds).
{
public:
    PurgeByAgeStrategy(const Timespan & age);
    ~PurgeByAgeStrategy();

    void purge(const std::string & path);

private:
    Timespan _age;
};


class Foundation_API PurgeByCountStrategy : public PurgeStrategy
/// This purge strategy ensures that a maximum number
/// of archived files is not exceeded. Files are deleted
/// based on their age, with oldest files deleted first.
{
public:
    PurgeByCountStrategy(int count);
    ~PurgeByCountStrategy();

    void purge(const std::string & path);

private:
    int _count;
};


class Foundation_API PurgeOneFileStrategy : public PurgeStrategy
/// This purge strategy unconditionally purges one oldest file.
/// If there are no archived files, it will truncate current "hot" log file.
/// Intended usage: when there are no space left on device with logs.
{
public:
    void purge(const std::string & path);
};


} // namespace Poco


#endif // Foundation_PurgeStrategy_INCLUDED
